package cn.controllor.req;

import cn.model.User;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.time.ZoneId;
import java.util.Arrays;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;

@Controller
@RequestMapping("/req")
public class ParamController {
    /**
     * 利用 方法 的参数进行获取数据 , 严格的要求是 ： 方法的参数名称一定是 传递过来的参数的名称
     * 注解中的 params 表示的意思是 ： 只有在请求中包含了这个参数名称， 才可以进行访问
     */
    @RequestMapping(value = "/handler1",params = {"username","password"})
    public void handler1(String username,String password,char gender,String[] hobbies){
        System.out.println("handler1");
        System.out.println(username);
        System.out.println(password);
        System.out.println(gender);
        System.out.println(Arrays.toString(hobbies));
    }

    /**
     * 利用 注解 RequestParam 进行获取指定的值 , 表达的含义类似于： request.getParameter( String name ) ;
     * 更加符合 ： String name = request.getParameter("username") ;
     */
    @RequestMapping("/handler2")
    public void handler2(@RequestParam("username") String name,
                        @RequestParam("password") String password,
                        @RequestParam("gender") char gender,
                        @RequestParam("hobbies") String[] hobbies){
        System.out.println("handler2");
        System.out.println(name);
        System.out.println(password);
        System.out.println(gender);
        System.out.println(Arrays.toString(hobbies));
    }

    /**
     * 获取 Cookie， 使用注解 @CookieValue 进行获取指定 cookie 的值
     */
    @RequestMapping("/handler3")
    public void handler3(@CookieValue("JSESSIONID") String sessionId){
        System.out.println("handler3");
        System.out.println(sessionId);
    }

    /**
     * 获取 字符数据 请求体 使用注解 @RequestBody
     */
    @RequestMapping("/handler4")
    public void handler4(@RequestBody String context){
        System.out.println("handler4");
        System.out.println(context);
    }
    /**
     * 获取到 字节数据 的请求体
     */
    @RequestMapping("/handler5")
    public void handler5(@RequestBody String context){
        System.out.println("handler5");
        System.out.println(context);
    }

    /**
     * 向请求对象中添加属性 ： request.setAttribute("user" , "132")
     * 会有一次 转发操作 ： request.getRequestDispatcher("").forward(request , response) ;
     * 转发之后 就可以从请求中获取数据了 ：Object o =  request.getAttribute("user")
     */
    @RequestMapping("/handler6")
    public String handler6(HttpServletRequest request){
        request.setAttribute("user","123456789");
        return "forward:/req/handler7";
    }

    /**
     * 注解 ： RequestAttribute 表达的含义是： Object o =  request.getAttribute("user")
     * 同理： 还有一个类似的注解 ： @SessionAttribute
     */
    @RequestMapping("/handler7")
    public void handler7(@RequestAttribute("user") String user){
        System.out.println("handler7");
        System.out.println(user);
    }

    /**
     * 路径变量： 就是 将 参数作为 URL 的一部分内容
     * https://blog.csdn.net/用户名/article/details/文章的编号
     * 在具体的路径中， {} 表示 一个 占位符 理解成一个 具有特殊意义的 ?
     */
    @RequestMapping("/handler8/{username}/article/{articleId}")
    public void handler8(@PathVariable("username") String username,
                         @PathVariable("articleId") String articleId){
        System.out.println("handler8");
        System.out.println(username);
        System.out.println(articleId);
    }

    /**
     * 此时，可以将请求中的参数 封装成 一个对象（ 自定义的对象 ）
     */
    @RequestMapping("/handler9")
    public void handler9(User user,String[] hobbies){
        System.out.println("handler9");
        System.out.println(user);
        System.out.println(Arrays.toString(hobbies));
    }

    @RequestMapping("/handler10")
    public void handler10(ServletRequest request, ServletResponse response,
                          InputStream inputStream, OutputStream outputStream,
                          Reader reader, Writer writer, HttpSession session,
                          HttpMethod httpMethod, Locale locale, ZoneId zoneId,
                          TimeZone timeZone, HttpEntity entity, Map map,
                          Model model, ModelMap modelMap){
        System.out.println(timeZone);
    }
}
